/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cidca.ia.pkg21;

// Cliente que lee y muestra la información que le envía un Servidor.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Cliente extends JFrame {

    private int[] corazones = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    private int[] picas = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    private int[] treboles = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    private int[] diamantes = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    private int yo;
    private int ocultaCorazones;
    private int ocultaTreboles;
    private int ocultaDiamantes;
    private int ocultaPicas;
    private JTextField campoIntroducir;
    private JTextArea areaPantalla;
    private DataOutputStream salida;
    private DataInputStream entrada;
    private String mensaje = "";
    private String servidorChat;
    private Socket cliente;

    // inicializar servidorChat y configurar GUI
    public Cliente(String host) {
        super("Cliente");

        servidorChat = host; // establecer el servidor al que se va a conectar este cliente

        Container contenedor = getContentPane();

        // crear campoIntroducir y registrar componente de escucha
        campoIntroducir = new JTextField();
        campoIntroducir.setEditable(false);
        campoIntroducir.addActionListener(
                new ActionListener() {

                    // enviar mensaje al servidor
                    public void actionPerformed(ActionEvent evento) {
                        enviarDatos(evento.getActionCommand());
                        campoIntroducir.setText("");
                    }
                }
        );

        contenedor.add(campoIntroducir, BorderLayout.NORTH);

        // crear areaPantalla
        areaPantalla = new JTextArea();
        contenedor.add(new JScrollPane(areaPantalla),
                BorderLayout.CENTER);

        setSize(300, 250);
        setVisible(true);

    } // fin del constructor de Cliente

    // conectarse al servidor y procesar mensajes del servidor
    private void ejecutarCliente() {
        // conectarse al servidor, obtener flujos, procesar la conexión
        try {
            conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
            obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida
            procesarConexion(); // Paso 3: procesar la conexión
        } // el servidor cerró la conexión
        catch (EOFException excepcionEOF) {
            System.err.println("El cliente termino la conexión" + excepcionEOF.getMessage());
        } // procesar los problemas que pueden ocurrir al comunicarse con el servidor
        catch (IOException excepcionES) {
            excepcionES.printStackTrace();
        } finally {
            //cerrarConexion(); // Paso 4: cerrar la conexión
        }

    } // fin del método ejecutarCliente

    // conectarse al servidor
    private void conectarAServidor() throws IOException {
        mostrarMensaje("Intentando realizar conexión\n");

        // crear Socket para realizar la conexión con el servidor
        cliente = new Socket(InetAddress.getByName(servidorChat), 12345);

        // mostrar la información de la conexión
        mostrarMensaje("Conectado a: " + cliente.getInetAddress().getHostName());
    }

    // obtener flujos para enviar y recibir datos
    private void obtenerFlujos() throws IOException {

        // establecer flujo de salida para los objetos
        salida = new DataOutputStream(cliente.getOutputStream());
      //salida.flush(); // vacíar búfer de salida para enviar información de encabezado

        // establecer flujo de entrada para los objetos
        entrada = new DataInputStream(cliente.getInputStream());

        //mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
    }

    // procesar la conexión con el servidor
    private void procesarConexion() throws IOException {
        // habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes
        establecerCampoTextoEditable(true);

        do { // procesar mensajes enviados del servidor

            // leer mensaje y mostrarlo en pantalla
            mensaje = (String) entrada.readUTF();
            mostrarMensaje("\n" + mensaje);

        } while (!mensaje.equals("SERVIDOR>>> TERMINAR"));

    } // fin del método procesarConexion

    // cerrar flujos y socket
    private void cerrarConexion() {
        mostrarMensaje("\nCerrando conexión");
        establecerCampoTextoEditable(false); // deshabilitar campoIntroducir

        try {
            salida.close();
            entrada.close();
            cliente.close();
        } catch (IOException excepcionES) {
            excepcionES.printStackTrace();
        }
    }

    // enviar mensaje al servidor
    private void enviarDatos(String mensaje) {
        // enviar objeto al servidor
        try {
            salida.writeUTF(mensaje);
            salida.flush();
            mostrarMensaje("\nCLIENTE>>> " + mensaje);
        } catch (Exception excepcion) {
            System.out.println("Problemas " + excepcion.getMessage());
        }

    }

   // método utilitario que es llamado desde otros subprocesos para manipular a 
    // areaPantalla en el subproceso despachador de eventos
    private void mostrarMensaje(final String mensajeAMostrar) {
        // mostrar mensaje del subproceso de ejecución de la GUI
        SwingUtilities.invokeLater(
                new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

                    public void run() // actualiza areaPantalla
                    {
                        String[] mensaje = mensajeAMostrar.split("\\|");
                        System.out.println(mensaje[0]);
                        if (mensaje[0].trim().equals("USTED")) {
                            yo = Integer.parseInt(mensaje[1]);
                            System.out.println("Tengo que guardar mi numero de jugador " + mensaje[1]);
                        }
                        if (mensaje[0].trim().equals("OCULTA")) {
                            if (mensaje[1].equals("CORAZONES")) {
                                ocultaCorazones = Integer.parseInt(mensaje[2]);
                            }

                            if (mensaje[1].equals("TREBOLES")) {
                                ocultaTreboles = Integer.parseInt(mensaje[2]);
                            }

                            if (mensaje[1].equals("DIAMANTES")) {
                                ocultaDiamantes = Integer.parseInt(mensaje[2]);
                            }

                            if (mensaje[1].equals("PICAS")) {
                                ocultaPicas = Integer.parseInt(mensaje[2]);
                            }

                            System.out.println("Mi carta oculta es " + mensaje[1] + " " + mensaje[2]);
                        }
                        if (mensaje[0].trim().equals("DIAMANTES")) {
                            String[] mensajeDos = mensaje[1].split(",");

                            for (int i = 0; i < mensajeDos.length; i++) {

                                diamantes[i] = Integer.parseInt(mensajeDos[i]);
                            }

                            System.out.println("Mi carta oculta es " + mensaje[1] + " " + mensaje[2]);
                        }

                        if (mensaje[0].trim().equals("TREBOLES")) {
                            String[] mensajeDos = mensaje[1].split(",");

                            for (int i = 0; i < mensajeDos.length; i++) {
                                treboles[i] = Integer.parseInt(mensajeDos[i]);
                            }

                            System.out.println("Mi carta oculta es " + mensaje[1] + " " + mensaje[2]);
                        }
                        if (mensaje[0].trim().equals("PICAS")) {
                            String[] mensajeDos = mensaje[1].split(",");

                            for (int i = 0; i < mensajeDos.length; i++) {
                                picas[i] = Integer.parseInt(mensajeDos[i]);
                            }

                            System.out.println("Mi carta oculta es " + mensaje[1] + " " + mensaje[2]);
                        }

                        if (mensaje[0].trim().equals("CORAZONES")) {
                            String[] mensajeDos = mensaje[1].split(",");

                            for (int i = 0; i < mensajeDos.length; i++) {
                                if (null != mensajeDos[i]) {

                                    corazones[i] = Integer.parseInt(mensajeDos[i]);
                                }
                            }

                            System.out.println("Mi carta oculta es " + mensaje[1] + " " + mensaje[2]);
                        }

                        if (mensaje[0].trim().equals("PIDE?")) {

                            System.out.println(yo);
                            System.out.println("Esta es la oculta corazones " + ocultaCorazones);
                            System.out.println("Esta es la oculta diamantes " + ocultaDiamantes);
                            System.out.println("Esta es la oculta picas " + ocultaPicas);
                            System.out.println("Esta es la oculta treboles " + ocultaTreboles);
                            for (int i = 0; i < corazones.length; i++) {
                                System.out.println(i + " Corazones = " + corazones[i]);
                            }

                            for (int i = 0; i < picas.length; i++) {
                                System.out.println(i + " Picas = " + picas[i]);
                            }

                            for (int i = 0; i < diamantes.length; i++) {
                                System.out.println(i + " Diamantes = " + diamantes[i]);
                            }

                            for (int i = 0; i < treboles.length; i++) {
                                System.out.println(i + " treboles = " + treboles[i]);
                            }

// Aqui corre su algoritmo inteligente y responde
                            // SI
                            // NO
                            // PERDI
                        }
                        areaPantalla.append(mensajeAMostrar);
                        areaPantalla.setCaretPosition(
                                areaPantalla.getText().length());
                    }

                } // fin de la clase interna

        ); // fin de la llamada a SwingUtilities.invokeLater
    }

   // método utilitario que es llamado desde otros subprocesos para manipular a 
    // campoIntroducir en el subproceso despachador de eventos
    private void establecerCampoTextoEditable(final boolean editable) {
        // mostrar mensaje del subproceso de ejecución de la GUI
        SwingUtilities.invokeLater(
                new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

                    public void run() // establece la capacidad de modificar campoIntroducir
                    {
                        campoIntroducir.setEditable(editable);
                    }

                } // fin de la clase interna

        ); // fin de la llamada a SwingUtilities.invokeLater
    }

    public static void main(String args[]) {
        Cliente aplicacion;

        if (args.length == 0) {
            aplicacion = new Cliente("127.0.0.1");
        } else {
            aplicacion = new Cliente(args[0]);
        }

        aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        aplicacion.ejecutarCliente();
    }

} // fin de la clase Cliente
